草庐IT

c++ - 混合 C++ 和 Fortran

全部标签

c++ - 我怎样才能使这个简单的 Fortran 90 代码更快?

我正在尝试比较使用Fortran90和C++计算整数立方和的简单代码的计算时间,因为我听说它们在相似级别上速度很快。我使用gfortran和g++(在MacOSX上)编译这些代码。有人可以指出为什么Fortran90代码比等效的C++代码(12秒)花费更多的时间(49秒)吗?我只知道C++是行专业,Fortran是列专业,但我认为这与这些代码无关。我怎样才能使这个fortran90代码更快?任何提示将不胜感激。谢谢。Fortran代码和编译gfortran-obb1code15.f90programcode15implicitnonedoubleprecision,dimension(

c++ - 从 Fortran 返回字符串到 C++

我在C++中有以下函数调用:intstrLength=20;char*name;getName(name,strLength);printf("name:%s\n",name);在Fortran中:subroutinegetName(name)bind(c,name='GETNAME')use,intrinsic::iso_c_bindingimplicitnonecharacter,intent(out)::namename='Martin'endsubroutinegetName当我执行C++例程时,输出是:name:M。现在,我想这是因为character,intent(out)

c++ - 将 FBO 混合到默认帧缓冲区

澄清一下,当我说“默认帧缓冲区”时,我指的是窗口系统提供的那个,它最终出现在你的显示器上。为了提高CAD应用程序的渲染速度,我设法将3D元素与Qt处理的2D元素分开,现在它们各自渲染到自己的FBO中。当需要将它们放到屏幕上时,我将3DFBO位block传输到默认FB上,然后我想在其上混合我的2DFBO。我已经很好地完成了blitting部分,但我看不出如何将我的2DFBO混合到它上面?两个FBO的大小和格式完全相同,并且都与默认FB相同。我确信这是一个简单的操作,但我在网上找不到任何东西-大概是我错过了我正在尝试做的事情的正确术语。虽然我使用的是Qt,但我可以毫无问题地使用native

c++ - 混合 C++ 和 Fortran 链接问题

我在网上做了一些搜索,但找不到如何从linux编译简单的C++和Fortran代码。我需要让它变得复杂,但我只需要知道如何从一个简单的例子开始。我的C++代码是这样的:#includeusingnamespacestd;externintAdd(int*,int*);externintMultiply(int*,int*);intmain(){inta,b,c;cout>a>>b;c=Add(&a,&b);cout我的Fortran代码是这样的:integerfunctionAdd(a,b)integera,bAdd=a+breturnendintegerfunctionMultipl

一个Fortran模块需要位于另一个模块中的子例程

我有这样的问题:main.f90->包含主文件sub_a.f90->包含子例程asub_b.f90->包含子例程belets_stuffs.f90->包含点2和3所需的所有功能。所有四个点都是单独写的。main.f90includesub_A.f90includesub_B.f90includeother_stuffs.f90programMAINuseAuseBuseother...callproc_Acall_proc_BendprogramMAINsub_a.f90moduleAcontainssubroutineproc_Auseother...callcomp

c++ - 如何将字符串数组从 C 和 Fortran 传递给 Fortran?

我正在尝试将字符串数组从C传递到Fortran子例程,以及从Fortran传递到同一个Fortran子例程。我成功地从C和Fortran传递了单个字符串(即一维字符数组)。但是,我在处理字符串数组时遇到了问题。我在Fortran端使用ISOC绑定(bind),理想情况下我希望这在调用端尽可能无缝。我已经阅读了一些相关的问题和答案。有些(即this和this)只是“使用ISOC”,没有进一步的细节,这没有多大帮助。Thisanswer非常有帮助(类似于adifferentquestion的答案),但仅适用于单个字符串,其中似乎在单个Fortran字符串中识别了c_null_char。如果

c++ - SSE 和 AVX 内在函数混合

除了SSE-copy,AVX-copyandstd::copyperformance.假设我们需要按以下方式对某些循环进行矢量化:1)通过AVX对第一个循环批处理(乘以8)进行矢量化。2)将循环的剩余部分分成两批。通过SSE向量化4的倍数的批处理。3)通过串行例程处理整个循环的剩余批处理。让我们考虑复制数组的例子:#includetemplatevoidsimd_copy(float*src,float*dest){autosrc_=src;autodest_=dest;//VectorizefirstpartofloopviaAVXfor(;src_!=src+unroll_boun

c++ - 混合使用不同编译器版本构建的二进制文件

我想知道,是否可以将调用代码放在使用不同工具链构建的.dll中?是否可以使用使用较旧编译器构建的.lib文件来构建带有较新编译器的代码?我知道,第二种不太可取,但我想知道,是不是不可能。准确地说,我的情况是这样的:我有使用b.lib文件用VC7.1构建的a.exe文件,该文件也是用VC7.1构建的。a.exe从c.dll调用代码,该代码也是使用b.dll构建的。现在我想写一个新的c.dll,但是用VC9编译。(我想这样做,因为我需要一些不支持使用VC7.1构建它们的库。)——我的c.dll还需要b.lib,我仍然有源代码,因此我可以重新编译它。那么,有没有可能让它发挥作用呢?如果不是,

c++ - 混合 std::move() 和 std::thread 不会编译

代码如下:#include#includeclassA{voidfoo(int&&arg)const{}voidboo()const{intvalue(0);std::threadt(&A::foo,this,std::move(value));t.join();}};intmain(){Aa;return0;}MSVisualStudio2012(工具集v110)给出下一个错误:errorC2664:'_Rxstd::_Pmf_wrap::operator()(const_Wrapper&,_V0_t)const':cannotconvertparameter2from'int'to

c++ - 在 CUDA 中混合自定义内存管理和 Thrust

在我的项目中,我实现了自定义内存分配器以避免不必要地调用cudaMalloc一旦应用程序“预热”。此外,我使用自定义内核进行基本数组填充、数组之间的算术运算等,并希望通过使用Thrust来简化我的代码。并摆脱这些内核。设备上的每个数组都是通过原始指针创建和访问的(目前),我想使用device_vector和Thrust这些对象上的s方法,但我发现自己在原始指针和device_ptr之间转换一直以来,我的代码都有些困惑。我相当模糊的问题:您将/如何组织自定义内存管理的使用,Thrusts数组方法和以最易读的方式调用自定义内核? 最佳答案